import keys from './majorentity-keys';
import { IContext, IEntityLocalDataService, IParams } from 'ibiz-core';
import { GlobalService } from '../../service';
import { IMAJORENTITY } from '../interface';

/**
 * MAJORENTITYDTOdto辅助类
 *
 * @export
 * @class MAJORENTITYDTOHelp
 */
export class MAJORENTITYDTOHelp {

    /**
     * 获取数据服务
     *
     * @param {IContext} context 应用上下文对象
     * @returns {*}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async getService(context: IContext): Promise<IEntityLocalDataService<IMAJORENTITY>> {
        return new GlobalService().getService('MAJORENTITY',context);
    }

    /**
     * DTO转化成数据对象
     *
     * @param {IContext} context 应用上下文对象
     * @param {IParams} source dto对象
     * @returns {*}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async ToDataObj(context: IContext, source: IParams) {
        const _data: any = {};
        // 建立时间
        _data.createdate = source.createdate;
        // 建立人
        _data.createman = source.createman;
        // 过期项目
        _data.eprojects = source.eprojects;
        // 属性
        _data.field = source.field;
        // 属性10
        _data.field10 = source.field10;
        // 属性11
        _data.field11 = source.field11;
        // 属性12
        _data.field12 = source.field12;
        // 属性13
        _data.field13 = source.field13;
        // 属性14
        _data.field14 = source.field14;
        // 属性15
        _data.field15 = source.field15;
        // 属性16
        _data.field16 = source.field16;
        // 属性17
        _data.field17 = source.field17;
        // 属性18
        _data.field18 = source.field18;
        // 属性19
        _data.field19 = source.field19;
        // 属性2
        _data.field2 = source.field2;
        // 属性20
        _data.field20 = source.field20;
        // 属性21
        _data.field21 = source.field21;
        // 属性22
        _data.field22 = source.field22;
        // 属性23
        _data.field23 = source.field23;
        // 属性24
        _data.field24 = source.field24;
        // 属性25
        _data.field25 = source.field25;
        // 属性26
        _data.field26 = source.field26;
        // 属性27
        _data.field27 = source.field27;
        // 属性28
        _data.field28 = source.field28;
        // 属性29
        _data.field29 = source.field29;
        // 属性3
        _data.field3 = source.field3;
        // 属性30
        _data.field30 = source.field30;
        // 属性31
        _data.field31 = source.field31;
        // 属性32
        _data.field32 = source.field32;
        // 属性33
        _data.field33 = source.field33;
        // 属性34
        _data.field34 = source.field34;
        // 属性35
        _data.field35 = source.field35;
        // 属性36
        _data.field36 = source.field36;
        // 属性37
        _data.field37 = source.field37;
        // 属性38
        _data.field38 = source.field38;
        // 属性39
        _data.field39 = source.field39;
        // 属性4
        _data.field4 = source.field4;
        // 属性40
        _data.field40 = source.field40;
        // 属性41
        _data.field41 = source.field41;
        // 属性42
        _data.field42 = source.field42;
        // 属性43
        _data.field43 = source.field43;
        // 属性44
        _data.field44 = source.field44;
        // 属性45
        _data.field45 = source.field45;
        // 属性46
        _data.field46 = source.field46;
        // 属性47
        _data.field47 = source.field47;
        // 父属性
        _data.field48 = source.field48;
        // 属性49
        _data.field49 = source.field49;
        // 属性5
        _data.field5 = source.field5;
        // 属性6
        _data.field6 = source.field6;
        // 属性7
        _data.field7 = source.field7;
        // 属性8
        _data.field8 = source.field8;
        // 属性9
        _data.field9 = source.field9;
        // 浮点
        _data.float = source.float;
        // 主实体标识
        _data.majorentityid = source.majorentityid;
        // 主实体名称
        _data.majorentityname = source.majorentityname;
        // 我的BUG
        _data.mybugs = source.mybugs;
        // 我的过期BUG
        _data.myebugs = source.myebugs;
        // 我的需求
        _data.mystorys = source.mystorys;
        // 我的任务
        _data.mytasks = source.mytasks;
        // 数值属性
        _data.number = source.number;
        // 未关闭产品
        _data.products = source.products;
        // 未关闭项目
        _data.projects = source.projects;
        // 年收入
        _data.revenue = source.revenue;
        // 排序属性测试
        _data.sort_field_test = source.sort_field_test;
        // 状态属性1
        _data.statefield1 = source.statefield1;
        // 状态属性2
        _data.statefield2 = source.statefield2;
        // 状态属性3
        _data.statefield3 = source.statefield3;
        // 非物理字段真假值
        _data.tf = source.tf;
        // 标题
        _data.title = source.title;
        // 更新时间
        _data.updatedate = source.updatedate;
        // 更新人
        _data.updateman = source.updateman;
        // 工作日期
        _data.workdate = source.workdate;
        // 处理预置字段（以srf开头）
        if(source && Object.keys(source).length >0){
            Object.keys(source).forEach((key:string) =>{
                if(key.startsWith('srf')){
                    _data[key] = source[key];
                }
            })
        }
        return _data;
    }

    /**
     * 转化数组(dto转化成数据对象)
     *
     * @param {IContext} context 应用上下文对象
     * @param {any[]} data 数据对象
     * @returns {any[]}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async ToDataObjArray(context: IContext, data: any[]) {
        const _data: any[] = [];
        if (data && Array.isArray(data) && data.length > 0) {
            for (let i = 0; i < data.length; i++) {
                const tempdata = await this.ToDataObj(context, data[i]);
                _data.push(tempdata);
            }
        }
        return _data;
    }

    /**
     * 数据对象转化成DTO
     *
     * @param {IContext} context 应用上下文对象
     * @param {*} source 数据对象
     * @returns {*}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async ToDto(context: IContext, source: IParams) {
        const _data: any = {};
        const excludes: string[] = [];
        // 建立时间
        _data.createdate = source.createdate;
        // 建立人
        _data.createman = source.createman;
        // 过期项目
        _data.eprojects = source.eprojects;
        // 属性
        _data.field = source.field;
        // 属性10
        _data.field10 = source.field10;
        // 属性11
        _data.field11 = source.field11;
        // 属性12
        _data.field12 = source.field12;
        // 属性13
        _data.field13 = source.field13;
        // 属性14
        _data.field14 = source.field14;
        // 属性15
        _data.field15 = source.field15;
        // 属性16
        _data.field16 = source.field16;
        // 属性17
        _data.field17 = source.field17;
        // 属性18
        _data.field18 = source.field18;
        // 属性19
        _data.field19 = source.field19;
        // 属性2
        _data.field2 = source.field2;
        // 属性20
        _data.field20 = source.field20;
        // 属性21
        _data.field21 = source.field21;
        // 属性22
        _data.field22 = source.field22;
        // 属性23
        _data.field23 = source.field23;
        // 属性24
        _data.field24 = source.field24;
        // 属性25
        _data.field25 = source.field25;
        // 属性26
        _data.field26 = source.field26;
        // 属性27
        _data.field27 = source.field27;
        // 属性28
        _data.field28 = source.field28;
        // 属性29
        _data.field29 = source.field29;
        // 属性3
        _data.field3 = source.field3;
        // 属性30
        _data.field30 = source.field30;
        // 属性31
        _data.field31 = source.field31;
        // 属性32
        _data.field32 = source.field32;
        // 属性33
        _data.field33 = source.field33;
        // 属性34
        _data.field34 = source.field34;
        // 属性35
        _data.field35 = source.field35;
        // 属性36
        _data.field36 = source.field36;
        // 属性37
        _data.field37 = source.field37;
        // 属性38
        _data.field38 = source.field38;
        // 属性39
        _data.field39 = source.field39;
        // 属性4
        _data.field4 = source.field4;
        // 属性40
        _data.field40 = source.field40;
        // 属性41
        _data.field41 = source.field41;
        // 属性42
        _data.field42 = source.field42;
        // 属性43
        _data.field43 = source.field43;
        // 属性44
        _data.field44 = source.field44;
        // 属性45
        _data.field45 = source.field45;
        // 属性46
        _data.field46 = source.field46;
        // 属性47
        _data.field47 = source.field47;
        // 父属性
        _data.field48 = source.field48;
        // 属性49
        _data.field49 = source.field49;
        // 属性5
        _data.field5 = source.field5;
        // 属性6
        _data.field6 = source.field6;
        // 属性7
        _data.field7 = source.field7;
        // 属性8
        _data.field8 = source.field8;
        // 属性9
        _data.field9 = source.field9;
        // 浮点
        _data.float = source.float;
        // 主实体标识
        _data.majorentityid = source.majorentityid;
        // 主实体名称
        _data.majorentityname = source.majorentityname;
        // 我的BUG
        _data.mybugs = source.mybugs;
        // 我的过期BUG
        _data.myebugs = source.myebugs;
        // 我的需求
        _data.mystorys = source.mystorys;
        // 我的任务
        _data.mytasks = source.mytasks;
        // 数值属性
        _data.number = source.number;
        // 未关闭产品
        _data.products = source.products;
        // 未关闭项目
        _data.projects = source.projects;
        // 年收入
        _data.revenue = source.revenue;
        // 排序属性测试
        _data.sort_field_test = source.sort_field_test;
        // 状态属性1
        _data.statefield1 = source.statefield1;
        // 状态属性2
        _data.statefield2 = source.statefield2;
        // 状态属性3
        _data.statefield3 = source.statefield3;
        // 非物理字段真假值
        _data.tf = source.tf;
        // 标题
        _data.title = source.title;
        // 更新时间
        _data.updatedate = source.updatedate;
        // 更新人
        _data.updateman = source.updateman;
        // 工作日期
        _data.workdate = source.workdate;
        // 附加额外数据
        if (source && Object.keys(source).length > 0 && keys) {
            Object.keys(source).forEach((key: string) => {
                if (!keys.includes(key) && !excludes.includes(key)) {
                    _data[key] = source[key];
                }
            })
        }
        return _data;
    }

    /**
     * 转化数组(数据对象转化成dto)
     *
     * @param {IContext} context 应用上下文对象
     * @param {any[]} data 
     * @returns {any[]}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async ToDtoArray(context: IContext, data: any[]) {
        const _data: any[] = [];
        if (data && Array.isArray(data) && data.length > 0) {
            for (let i = 0; i < data.length; i++) {
                const tempdata = await this.ToDto(context, data[i]);
                _data.push(tempdata);
            }
        }
        return _data;
    }

    /**
     * 处理响应dto对象
     *
     * @param {*} context 应用上下文对象
     * @param {*} data 响应dto对象
     * @returns {*}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async set(context: IContext, data: any) {
        const _data: IParams = await this.ToDataObj(context, data);
        return _data;
    }

    /**
     * 处理请求数据对象
     *
     * @param {*} context 应用上下文对象
     * @param {*} data 数据对象
     * @returns {*}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async get(context: IContext, data: any = {}) {
        return await this.ToDto(context, data);
    }

    /**
     * 获取缓存数据
     *
     * @param {*} context 应用上下文对象
     * @param {*} srfkey 数据主键
     * @returns {*}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async getCacheData(context: IContext, srfkey: string) {
        const targetService: IEntityLocalDataService<IMAJORENTITY> = await this.getService(context);
        const result =  await targetService.getLocal(context, srfkey);
        if(result){
            return await this.ToDto(context,result);
        }
    }

    /**
     * 获取缓存数组
     *
     * @param {*} context 应用上下文对象
     * @returns {any[]}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async getCacheDataArray(context: IContext) {
        const targetService: IEntityLocalDataService<IMAJORENTITY> = await this.getService(context);
        const result =  await targetService.getLocals(context);
        if(result && result.length >0){
            return await this.ToDtoArray(context,result);
        }else{
            return [];
        }
    }

    /**
     * 设置缓存数据
     *
     * @param {*} context 应用上下文对象
     * @param {any} data 数据
     * @returns {any[]}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async setCacheData(context: IContext, data: any) {
        const targetService: IEntityLocalDataService<IMAJORENTITY> = await this.getService(context);
        const _data: any = await this.set(context, data);
        await targetService.addLocal(context, _data);
    }

    /**
     * 设置缓存数组
     *
     * @param {*} context 应用上下文对象
     * @param {any[]} data 数据
     * @returns {any[]}
     * @memberof MAJORENTITYDTOHelp
     */
    public static async setCacheDataArray(context: IContext, data: any[]) {
        if (data && data.length > 0) {
            const targetService: IEntityLocalDataService<IMAJORENTITY> = await this.getService(context);
            for (let i = 0; i < data.length; i++) {
                const _data = await this.set(context, data[i]);
                await targetService.addLocal(context, _data);
            }
        }
    }


}
